package com.huang

import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity

open class BaseActivity : AppCompatActivity() {

    private lateinit var receiver : ForceOfflineReceiver

    /**
     * 在活动创建时调用的方法
     * 该方法确保在每次活动创建时，都将当前活动实例添加到活动控制器中
     * 这对于活动的管理和监控非常重要，尤其是在整个应用生命周期中对活动进行跟踪时
     *
     * @param savedInstanceState 保存的实例状态，可以在活动重新创建时恢复以前的状态
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 将当前活动添加到活动控制器的活动列表中
        ActivityController.addActivity(this)
    }

    /**
     * 在Activity生命周期中，当Activity即将被销毁时调用此方法
     * 重写此方法以确保在Activity销毁时执行必要的清理工作
     */
    override fun onDestroy() {
        super.onDestroy()
        // 当Activity不再使用时，从Activity控制器中移除该Activity
        ActivityController.removeActivity(this)
    }

    /**
     * 当应用从后台重新回到前台时调用
     */
    @SuppressLint("UnspecifiedRegisterReceiverFlag")
    override fun onResume() {
        super.onResume()
        // 创建一个意图过滤器，用于接收特定的广播
        val intentFilter = IntentFilter()
        // 添加要接收的广播动作
        intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE")
        // 实例化广播接收器
        receiver = ForceOfflineReceiver()
        // 注册广播接收器，使其可以接收指定的广播
        registerReceiver(receiver, intentFilter)
    }

    /**
     * 生命周期方法：暂停
     * 该方法在活动失去焦点时被调用，但仍然对用户可见
     * 主要用于暂停某些操作，以及释放一些资源
     */
    override fun onPause() {
        super.onPause()
        // 注销广播接收器，以节省资源并避免潜在的内存泄漏
        unregisterReceiver(receiver)
    }

    inner class ForceOfflineReceiver: BroadcastReceiver() {
        /**
         * 当接收到广播时调用，此方法用于处理接收到的意图
         *
         * @param context 上下文，用于访问应用程序资源、数据库等
         * @param intent 接收到的意图，包含动作、数据等信息
         */
        override fun onReceive(context: Context?, intent: Intent?) {
            // 使用AlertDialog创建一个警告对话框，提醒用户已被强制下线
            AlertDialog.Builder(context!!).apply {
                // 设置对话框标题
                setTitle("Warning")
                // 设置对话框消息内容
                setMessage("You are forced to be offline. Please try to login again.")
                // 设置对话框不可通过点击外部区域取消
                setCancelable(false)
                // 设置确定按钮，点击后将关闭所有活动，并跳转到登录界面
                setPositiveButton("OK") { _, _ ->
                    // 调用ActivityController的finishAll方法关闭所有活动
                    ActivityController.finishAll()
                    // 创建一个意图，用于启动LoginActivity
                    val i = Intent(context, LoginActivity::class.java)
                    // 使用上下文启动LoginActivity
                    context.startActivity(i)
                }
                // 显示对话框
                show()
            }
        }
    }
}